re:Inventの画像を簡単に掲載できるようにFFmpegを使って画像を一括で圧縮した件

re:Inventの画像を簡単に掲載できるようにFFmpegを使って画像を一括で圧縮した件

re:Inventなどでイベントレポートを書く際に、画像の圧縮を手作業でやってて面倒になったのでカッとなって作りました
Clock Icon2024.12.03

こんばんは、リテールアプリ共創部のmorimorikochanです。
re:Inventが現在開催されており、社内や社外のre:Invent参加者はレポートを書くので忙しいのではないでしょうか

そんな中、弊社のブログ執筆環境では記事に添付できる画像1枚あたりのサイズ(容量)の上限が決まっています。
もし画像のサイズが大きいとユーザーが閲覧した際にローディング時間が長くなるのを抑制する目的だと思います。

ですが、最近のスマートフォンで撮影した写真は軽くこの上限を超えるため、いちいち手作業で画像を圧縮するのがとてもめんどくさいと私は感じていました。(特にセッションレポートなど画像が多いとなおさら)
そこで、一括でディレクトリ内の画像を圧縮するスクリプトを書いたので共有します。

# 初回のみ
brew install ffmpeg

# 対象ディレクトリに移動した後実行
cd target_directory
for f in **/*.JPG; do ffmpeg -i "$f"  -q:v 18  ./min."$f"; done

-q:v 18の数値部分を変更すると、圧縮比率が変わります。
高ければ高いほどより圧縮されるのでサイズは小さくなりますが、画像の品質も落ちます。

実行例

$ eza
Permissions Size User           Date Modified Name
.rw-r--r--@  25k morimorikochan  3 Dec 00:24  .DS_Store
.rw-r--r--@ 2.7M morimorikochan  3 Dec 00:04  IMG_0001.JPG
.rw-r--r--@ 2.8M morimorikochan  3 Dec 00:04  IMG_0002.JPG
.rw-r--r--@ 2.2M morimorikochan  3 Dec 00:04  IMG_0003.JPG
# ...多すぎるので省略
.rw-r--r--@ 2.5M morimorikochan  3 Dec 00:04  IMG_9997.JPG
.rw-r--r--@ 2.8M morimorikochan  3 Dec 00:04  IMG_9998.JPG
.rw-r--r--@ 2.5M morimorikochan  3 Dec 00:04  IMG_9999.JPG

$ for f in **/*.JPG; do ffmpeg -i "$f"  -q:v 18  ./min."$f"; done
for f in **/*.JPG; do ffmpeg -i "$f"  -q:v 18  ./min."$f"; done
ffmpeg version 7.1 Copyright (c) 2000-2024 the FFmpeg developers
  built with Apple clang version 15.0.0 (clang-1500.1.0.2.5)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/7.1_3 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon
  libavutil      59. 39.100 / 59. 39.100
  libavcodec     61. 19.100 / 61. 19.100
  libavformat    61.  7.100 / 61.  7.100
  libavdevice    61.  3.100 / 61.  3.100
  libavfilter    10.  4.100 / 10.  4.100
  libswscale      8.  3.100 /  8.  3.100
  libswresample   5.  3.100 /  5.  3.100
  libpostproc    58.  3.100 / 58.  3.100
Input #0, image2, from 'IMG_0001.JPG':
  Duration: 00:00:00.04, start: 0.000000, bitrate: 542210 kb/s
  Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 4032x3024, 25 fps, 25 tbr, 25 tbn
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> mjpeg (native))
Press [q] to stop, [?] for help
Output #0, image2, to './min.IMG_0001.JPG':
  Metadata:
    encoder         : Lavf61.7.100
  Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown, progressive), 4032x3024, q=2-31, 200 kb/s, 25 fps, 25 tbn
      Metadata:
        encoder         : Lavc61.19.100 mjpeg
      Side data:
        ICC Profile
        cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
[image2 @ 0x12a704da0] The specified filename './min.IMG_0001.JPG' does not contain an image sequence pattern or a pattern is invalid.
[image2 @ 0x12a704da0] Use a pattern such as %03d for an image sequence or use the -update option (with -frames:v 1 if needed) to write a single image.
[out#0/image2 @ 0x600003e8c000] video:190KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown
frame=    1 fps=0.0 q=18.0 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.442x    

# ...繰り返し

今回は-q:v 18で実行してみましたが、以下のような結果になりました。

ファイル名 圧縮前 圧縮後
IMG_0001.JPG 2.7MB 194KB
IMG_0002.JPG 2.8MB 247KB
IMG_0003.JPG 2.7MB 165KB

約1/10ほどのサイズになっていますね。
これぐらいであればブログに掲載しても大丈夫なはずです...!

これでみなさんのイベントレポート執筆環境が良くなれば幸いです

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.